1 module hip.api.data.ini;
2 
3 
4 struct IniVar
5 {
6     string name;
7     string value;
8 
9     pragma(inline, true) string get() => value;
10     pragma(inline, true) string opAssign(string v) () => value = v;
11 
12     version(Have_util)
13     {
14         import hip.util.variant;
15         private Variant data;
16         IniVar opAssign(IniVar var){this.name = var.name; this.value = var.value; this.data = var.data; return this;}
17 
18         T get(T)()
19         {
20             static if(is(T == string))
21                 return get;
22             else
23             {
24                 if(data.type == Type.undefined)
25                     data = Variant.make!T(value);
26                 return data.get!T;
27             }
28         }
29         pragma(inline, true) auto opAssign(T)(T v) => data.set!T(v);
30     }
31     string toString() const @safe pure nothrow{return name~" = "~ value;}
32 }
33 
34 struct IniBlock
35 {
36     string name;
37     string comment;
38     IniVar[string] vars;
39 
40     string toString() const @safe pure
41     {
42         string ret = "["~name~"]\n";
43         foreach (v; vars)
44             ret~= v.toString();
45         return ret;
46     }
47     pragma(inline, true) auto opDispatch(string member)() => vars[member];
48     alias vars this;
49 }
50 
51 /**
52 *   Usage:
53 ```d
54 //If not found, use 2 as default
55 ini.tryGet!ubyte("buffering.count", 2);
56 //Alternative usage
57 ini.buffering.count.get!ubyte
58 ```
59 */
60 interface IHipIniFile
61 {
62     ref IniBlock[string] blocks();
63     const(string[]) getErrors() const;
64     bool noError() const;
65     version(Have_util)
66     {
67         IniVar* getIniVar(string varPath);
68         T tryGet(T)(string varPath, T defaultVal = T.init)
69         {
70             IniVar* v = getIniVar(varPath);
71             if(v is null)
72                 return defaultVal;
73             return v.get!T;
74         }
75     }
76     auto opDispatch(string member)() => blocks[member];
77 }